ruby on rails - Rails 4 উদ্বেগ ব্যবহার কিভাবে




ruby-on-rails ruby-on-rails-4 (4)

আমি ত্বক-আকারের চর্বি মডেলগুলির সাথে মডেল মডেলগুলির উদ্বেগগুলি ব্যবহার করার পাশাপাশি আপনার মডেল কোডগুলি ড্রি আপ করতে পড়ছি। এখানে উদাহরণ দিয়ে একটি ব্যাখ্যা আছে:

1) মডেল কোড ড্রিংক

একটি নিবন্ধ মডেল, একটি ইভেন্ট মডেল এবং একটি মন্তব্য মডেল বিবেচনা করুন। একটি নিবন্ধ বা একটি ঘটনা অনেক মন্তব্য আছে। একটি মন্তব্য হয় নিবন্ধ বা ঘটনা সম্পর্কিত।

ঐতিহ্যগতভাবে, মডেলগুলি এইরকম দেখতে পারে:

মন্তব্য মডেল:

class Comment < ActiveRecord::Base
  belongs_to :commentable, polymorphic: true
end

নিবন্ধ মডেল:

class Article < ActiveRecord::Base
  has_many :comments, as: :commentable 

  def find_first_comment
    comments.first(created_at DESC)
  end

  def self.least_commented
   #return the article with least number of comments
  end
end

ইভেন্ট মডেল

class Event < ActiveRecord::Base
  has_many :comments, as: :commentable 

  def find_first_comment
    comments.first(created_at DESC)
  end

  def self.least_commented
   #returns the event with least number of comments
  end
end

আমরা বিজ্ঞপ্তি দিতে পারি, ঘটনা এবং নিবন্ধ উভয় ক্ষেত্রে সাধারণ কোডের একটি উল্লেখযোগ্য অংশ। উদ্বেগ ব্যবহার করে আমরা একটি পৃথক মডিউল মন্তব্যযোগ্য এই সাধারণ কোড নিষ্কাশন করতে পারেন।

এই জন্য অ্যাপ্লিকেশন / মডেল / উদ্বেগ একটি commentable.rb ফাইল তৈরি করুন।

module Commentable
  extend ActiveSupport::Concern

  included do
    has_many :comments, as: :commentable
  end

  # for the given article/event returns the first comment
  def find_first_comment
    comments.first(created_at DESC)
  end

  module ClassMethods
    def least_commented
      #returns the article/event which has the least number of comments
    end
  end
end

এবং এখন আপনার মডেল এই মত চেহারা:

মন্তব্য মডেল:

class Comment < ActiveRecord::Base
  belongs_to :commentable, polymorphic: true
end

নিবন্ধ মডেল:

class Article < ActiveRecord::Base
  include Commentable
end

ইভেন্ট মডেল:

class Event < ActiveRecord::Base
  include Commentable
end

2) স্কিন-নাইজিং ফ্যাট মডেল।

একটি ইভেন্ট মডেল বিবেচনা করুন। একটি ঘটনা অনেক অংশগ্রহণকারীদের এবং মন্তব্য আছে।

সাধারণত, ইভেন্ট মডেল এই মত চেহারা হতে পারে

class Event < ActiveRecord::Base   
  has_many :comments
  has_many :attenders


  def find_first_comment
    # for the given article/event returns the first comment
  end

  def find_comments_with_word(word)
    # for the given event returns an array of comments which contain the given word
  end 

  def self.least_commented
    # finds the event which has the least number of comments
  end

  def self.most_attended
    # returns the event with most number of attendes
  end

  def has_attendee(attendee_id)
    # returns true if the event has the mentioned attendee
  end
end

অনেক সংস্থাগুলির সাথে মডেলগুলি এবং অন্যথায় আরো বেশি কোড জমা এবং প্রগতিশীল হওয়ার প্রবণতা থাকে। কনসার্নগুলি তাদের আরও মডিউলাইজড এবং বোঝার জন্য সহজ করে ত্বক-আকারের চর্বি মডিউলগুলির একটি উপায় সরবরাহ করে।

উপরের মডেলটি নীচের মত উদ্বেগগুলি ব্যবহার করে attendable.rb যেতে পারে: অ্যাপ্লিকেশন / মডেল / উদ্বেগ / ইভেন্ট ফোল্ডারে attendable.rb এবং commentable.rb ফাইল তৈরি করুন

attendable.rb

module Attendable
  extend ActiveSupport::Concern

  included do 
    has_many :attenders
  end

  def has_attender(attender_id)
    # returns true if the event has the mentioned attendee
  end

  module ClassMethods
    def most_attended
      # returns the event with most number of attendes
    end
  end
end

commentable.rb

module Commentable
  extend ActiveSupport::Concern

  included do 
    has_many :comments
  end

  def find_first_comment
    # for the given article/event returns the first comment
  end

  def find_comments_with_word(word)
    # for the given event returns an array of comments which contain the given word
  end

  module ClassMethods
    def least_commented
      # finds the event which has the least number of comments
    end
  end
end

এবং এখন কনসার্ন ব্যবহার করে, আপনার ইভেন্ট মডেল হ্রাস

class Event < ActiveRecord::Base
  include Commentable
  include Attendable
end

* উদ্ভাবনী ব্যবহার করার পরিবর্তে 'প্রযুক্তিগত' গোষ্ঠীর পরিবর্তে 'ডোমেন' ভিত্তিক গোষ্ঠীগুলির জন্য যেতে পরামর্শ দেওয়া হচ্ছে। ডোমেন ভিত্তিক গোষ্ঠীটি 'মন্তব্যযোগ্য', 'ফটোতেযোগ্য', 'Attendable' এর মত। কারিগরি গোষ্ঠীটির অর্থ 'বৈধকরণ পদ্ধতি', 'ফাইন্ডার পদ্ধতি' ইত্যাদি

ডিফল্ট Rails 4 প্রকল্প জেনারেটর এখন কন্ট্রোলার এবং মডেলের অধীনে "উদ্বেগ" ডিরেক্টরি তৈরি করে। আমি রাউটিং উদ্বেগগুলি কীভাবে ব্যবহার করব তা সম্পর্কে কিছু ব্যাখ্যা পেয়েছি, তবে কন্ট্রোলার বা মডেল সম্পর্কে কিছুই নেই।

আমি নিশ্চিত যে এটি সম্প্রতি "ডিসিআই প্রবণতা" সম্প্রদায়ের সাথে করতে হবে এবং এটি চেষ্টা করে দেখতে চাই।

প্রশ্ন হল, আমি কিভাবে এই বৈশিষ্ট্যটি ব্যবহার করতে অনুমিত, এটি নামকরণের জন্য নামকরণ / বর্গ অনুক্রমটি কীভাবে সংজ্ঞায়িত করতে হবে তার একটি সম্মেলন আছে? আমি কিভাবে একটি মডেল বা নিয়ামক একটি উদ্বেগ অন্তর্ভুক্ত করতে পারেন?


উদ্বেগ ইন ফাইল filename.rb করুন

উদাহরণস্বরূপ আমি আমার অ্যাপ্লিকেশনে চাই যেখানে create_by attribute দ্বারা আপডেট আছে সেখানে আপডেট 1 দ্বারা 0 এবং 0 দ্বারা মান

module TestConcern 
  extend ActiveSupport::Concern

  def checkattributes   
    if self.has_attribute?(:created_by)
      self.update_attributes(created_by: 1)
    end
    if self.has_attribute?(:updated_by)
      self.update_attributes(updated_by: 0)
    end
  end

end

তার পরে আপনার মডেলের মধ্যে এটি অন্তর্ভুক্ত করুন:

class Role < ActiveRecord::Base
  include TestConcern
end

তাই আমি নিজেকে দ্বারা এটি খুঁজে পাওয়া যায় নি। এটা আসলে একটি প্রশংসাসূচক সহজ কিন্তু শক্তিশালী ধারণা। নীচের উদাহরণ হিসাবে এটি কোড পুনঃব্যবহার করতে হবে। মূলত, মডেলগুলি পরিষ্কার করার জন্য এবং সাধারণ ও / অথবা প্রসঙ্গের নির্দিষ্ট অংশগুলি বের করার জন্য ধারণাগুলি অত্যন্ত পরিষ্কার এবং নোংরা হয়ে যাওয়া এড়ানো।

উদাহরণস্বরূপ, আমি একটি সুপরিচিত প্যাটার্ন, taggable প্যাটার্ন রাখব:

# app/models/product.rb
class Product
  include Taggable

  ...
end

# app/models/concerns/taggable.rb
# notice that the file name has to match the module name 
# (applying Rails conventions for autoloading)
module Taggable
  extend ActiveSupport::Concern

  included do
    has_many :taggings, as: :taggable
    has_many :tags, through: :taggings

    class_attribute :tag_limit
  end

  def tags_string
    tags.map(&:name).join(', ')
  end

  def tags_string=(tag_string)
    tag_names = tag_string.to_s.split(', ')

    tag_names.each do |tag_name|
      tags.build(name: tag_name)
    end
  end

  # methods defined here are going to extend the class, not the instance of it
  module ClassMethods

    def tag_limit(value)
      self.tag_limit_value = value
    end

  end

end

তাই পণ্যের নমুনা অনুসরণ করে, আপনি যে কোনও শ্রেণীতে ট্যাগগেবেল যুক্ত করতে পারেন এবং তার কার্যকারিতা ভাগ করতে পারেন।

এটি বেশ ভাল DHH দ্বারা ব্যাখ্যা করা হয়:

রেলের 4, আমরা ডিফল্ট অ্যাপ্লিকেশন / মডেল / উদ্বেগ এবং অ্যাপ্লিকেশন / কন্ট্রোলার / উদ্বেগ ডিরেক্টরিগুলির সাথে উদ্বেগগুলি ব্যবহার করার জন্য প্রোগ্রামারদের আমন্ত্রণ জানাতে যা স্বয়ংক্রিয়ভাবে লোড পাথের অংশ। ActiveSupport :: Concern wrapper এর সাথে একত্রে, এই হালকা ওজন ফ্যাক্টরিং প্রক্রিয়াটি আলোকিত করার জন্য এটি যথেষ্ট সমর্থন।


এই পোস্টে আমাকে উদ্বেগ বুঝতে সাহায্য করেছে।

# app/models/trader.rb
class Trader
  include Shared::Schedule
end

# app/models/concerns/shared/schedule.rb
module Shared::Schedule
  extend ActiveSupport::Concern
  ...
end




dci