Làm cách nào để thiết lập các tham số bổ sung trong has_many thông qua các liên kết?has_many thông qua các thuộc tính bổ sung
Cảm ơn. Neelesh
Làm cách nào để thiết lập các tham số bổ sung trong has_many thông qua các liên kết?has_many thông qua các thuộc tính bổ sung
Cảm ơn. Neelesh
has_many :tags, :through => :post_tags, :conditions => ['tag.owner_id = ?' @owner.id]
Còn khi thực hiện thẻ << new_tag thì sao? – Neelesh
Có cùng một vấn đề ở đây. Không thể tìm thấy bất kỳ hướng dẫn nào để làm cho nó hoạt động nhanh chóng trên Rails 3. Nhưng bạn vẫn có thể nhận được những gì bạn muốn thông qua mô hình tham gia chính nó.
p = Post.new(:title => 'Post', :body => 'Lorem ipsum ...')
t = Tag.new(:title => 'Tag')
p.tags << t
p.save # saves post, tag and also add record to posttags table, but additional attribute is NULL now
j = PostTag.find_by_post_id_and_tag_id(p,t)
j.user_id = params[:user_id]
j.save # this finally saves additional attribute
Rất xấu xí nhưng điều này làm việc từ tôi.
Hình như nó sẽ hoạt động, nhưng có một cách neater, xem câu trả lời của tôi :) –
bài viết trên blog này có giải pháp hoàn hảo: http://www.tweetegy.com/2011/02/setting-join-table-attribute-has_many-through-association-in-rails-activerecord/
Đó giải pháp là: tạo của bạn ": thông qua mô hình" bằng tay, chứ không phải thông qua cách tự động khi bạn thêm vào mảng chủ sở hữu của hãng.
Sử dụng ví dụ từ bài đăng trên blog đó. Mô hình của bạn ở đâu:
class Product < ActiveRecord::Base
has_many :collaborators
has_many :users, :through => :collaborators
end
class User < ActiveRecord::Base
has_many :collaborators
has_many :products, :through => :collaborators
end
class Collaborator < ActiveRecord::Base
belongs_to :product
belongs_to :user
end
Trước đây bạn có thể đã đi: product.collaborators << current_user
.
Tuy nhiên, để thiết lập các tham số bổ sung (trong ví dụ này is_admin
), chứ không phải là cách tự động phụ thêm vào mảng, bạn có thể làm nó bằng tay như:
product.save && product.collaborators.create(:user => current_user, :is_admin => true)
Cách tiếp cận này cho phép bạn đặt các đối số bổ sung tại thời điểm lưu. NB. product.save
là cần thiết nếu mô hình chưa được lưu, nếu không mô hình đó có thể bị bỏ qua.
Tôi cũng ở trong tình huống tương tự, nơi tôi muốn có bảng tham gia tham gia 3 mô hình. Nhưng tôi muốn ID mẫu thứ ba được lấy từ mô hình thứ hai.
class Ingredient < ActiveRecord::Base
end
class Person < ActiveRecord::Base
has_many :food
has_many :ingredients_food_person
has_many :ingredients, through: :ingredients_food_person
end
class Food
belongs_to :person
has_many :ingredient_food_person
has_many :ingredients, through: :ingredients_food_person
before_save do
ingredients_food_person.each { |ifp| ifp.person_id = person_id }
end
end
class IngredientFoodPerson < ActiveRecord::Base
belongs_to :ingredient
belongs_to :food
belongs_to :person
end
Và đáng ngạc nhiên, bạn có thể làm một cái gì đó như thế này:
food = Food.new ingredients: [Ingredient.new, Ingredient.new]
food.ingredients_food_person.size # => 2
food.save
Lúc đầu, tôi nghĩ rằng trước khi tôi lưu lại, tôi sẽ không có quyền truy cập vào #ingredients_food_person sau khi gán #ingredients. Nhưng nó tạo ra các mô hình tự động.
chẳng hạn như thông số bổ sung nào? – s84
Tôi đã có một bài đăng mẫu, một mô hình tham gia PostTag và một thẻ mô hình. Tôi muốn chỉ định ai đã tạo thẻ được liên kết cho bài đăng. – Neelesh
@Sửa đổi mô hình kết hợp chính nó có khả năng có thể có các thuộc tính bổ sung ngoài id của hai đối tượng được liên kết. –